package improve;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2023-03-02
 * Time: 20:32
 */

//开闭原则
public class Ocp {
    //改进思路:
    //1.把创建的Shape类做为抽象类,并提供一个抽象的draw方法
    //让子类去实现即可,这样我们就有新的图形种类时，只需满足让新的图形类继承Shape
    //并实现draw方法即可 使用方的代码就不需要修改,满足开闭原则

    public static void main(String[] args) {
        //使用 画图的类
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        //把相应的对象实列 传给了对象 drawShape 根据传过去的type类型不同 调用了不同的方法

        //新增
        graphicEditor.drawShape(new Triangle());

        //改进新增
        graphicEditor.drawShape(new Pxsbx());
    }
}

//这是一个绘图的类 GraphicEditor 图形编辑器
//这个类就是使用方 要修改
class GraphicEditor{
    //drawShape 画形状的方法  接收Shape对象 根据type绘制不同的图像
    public void drawShape(Shape s){
        //之前的分支判断都不需要了
//        if (s.m_type == 1){
//            drawRectangle(s);
//        } else if (s.m_type == 2) {
//            drawCircle(s);
//        } else if (s.m_type == 3) {
//            //新增了累心判断
//            drawSjx(s);
//        }
        //这样代码就解决了
        s.draw();

    }

//    //画矩形
//    public void drawRectangle(Shape r){
//        System.out.println("绘制矩形");
//    }
//
//    //画圆形
//    public void drawCircle(Shape r){
//        System.out.println("绘制圆形");
//    }
//
//    //增加绘制三角形
//    public void drawSjx(Shape r){
//        System.out.println("绘制▲");
//    }

}

// shape (谁普) 形状 改为一个抽象类
abstract class Shape{
    int m_type;

    //写一个抽象方法
    public abstract void draw();
}

//矩形类 继承 Shape
class Rectangle extends Shape{
    Rectangle(){
        super.m_type = 1;
    }

    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

//圆形类 继承 Shape 在构建的时候赋不同的类型
class Circle extends Shape{
    Circle(){
        super.m_type = 2;
    }

    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

//新增三角形
class Triangle extends Shape{
    Triangle(){
        super.m_type = 3;
    }

    @Override
    public void draw() {
        System.out.println("绘制三角形");
    }
}

//新增一个图形 类型判断也不需要了
class Pxsbx extends Shape{


    @Override
    public void draw() {
        System.out.println("平行四边形");
    }
}